package org.example.pingpong.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.example.pingpong.domain.po.Application;
import org.example.pingpong.domain.vo.Result;
import org.example.pingpong.service.ApplicationService;
import org.example.pingpong.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * 报名管理接口
 */
@Api(tags = "04.报名管理接口")  // 为该控制器提供Swagger接口文档描述
@RestController
@RequestMapping("/application")  // 设置请求路径为 /application
public class ApplicationController {

    @Autowired
    private ApplicationService applicationService;  // 注入 ApplicationService 服务

    /**
     * 添加报名申请
     *
     * @param EVENT_ID 活动ID
     * @param STATUS   报名状态（例如已报名、待审核等）
     * @return 操作结果
     */
    @ApiOperation("报名添加接口")
    @PostMapping("/add")
    public Result add(@RequestParam Integer EVENT_ID, @RequestParam Integer STATUS) {
        Map<String, Object> map = ThreadLocalUtil.get();  // 获取当前线程中的用户信息
        if(applicationService.list(new LambdaQueryWrapper<Application>().eq(Application::getEventId, EVENT_ID).eq(Application::getUserId, map.get("id"))).size() > 0) {
            return Result.fail(553, "该用户已报名该场比赛");
        }

        Application application = new Application();
        application.setEventId(EVENT_ID);  // 设置活动ID
        application.setStatus(STATUS);     // 设置报名状态
        application.setUserId((Integer) map.get("id"));  // 设置当前用户ID
        applicationService.save(application);  // 调用服务保存报名信息

        return Result.success(null);  // 返回成功结果
    }

    /**
     * 删除报名申请
     *
     * @param ID 报名ID
     * @return 操作结果
     */
    @ApiOperation("报名删除接口")
    @DeleteMapping("/delete")
    public Result del(@RequestParam Integer ID) {
        applicationService.removeById(ID);  // 根据报名ID删除报名记录
        return Result.success(null);  // 返回成功结果
    }

    /**
     * 获取报名详情
     *
     * @param ID 报名ID
     * @return 报名详情
     */
    @ApiOperation("报名详情接口")
    @GetMapping("/detail")
    public Result detail(@RequestParam Integer ID) {
        return Result.success(applicationService.getById(ID));  // 返回指定报名ID的报名详情
    }

    /**
     * 获取报名列表，支持分页
     *
     * @param PAGE 当前页码
     * @param SIZE 每页记录数
     * @return 分页的报名记录列表
     */
    @ApiOperation("查看所有报名接口")
    @GetMapping("/list")
    public Result list(@RequestParam Integer PAGE, @RequestParam Integer SIZE) {
        return Result.success(applicationService.page(new Page<>(PAGE, SIZE)));  // 返回分页查询结果
    }

    /**
     * 修改报名信息
     *
     * @param ID       报名ID
     * @param EVENT_ID 活动ID
     * @param STATUS   报名状态
     * @return 修改后的报名详情
     */
    @ApiOperation("报名编辑接口")
    @PutMapping("/edit")
    public Result edit(@RequestParam Integer ID, @RequestParam Integer EVENT_ID, @RequestParam Integer STATUS) {
        if(applicationService.getById(ID) == null) {
            return Result.fail(552,"该id对应报名为空");
        }
        Map<String, Object> map = ThreadLocalUtil.get();  // 获取当前线程中的用户信息
        UpdateWrapper wrapper = new UpdateWrapper();
        wrapper.eq("id", ID);  // 设置查询条件，依据报名ID
        wrapper.set("event_id", EVENT_ID);  // 更新活动ID
        wrapper.set("status", STATUS);      // 更新报名状态
        wrapper.set("user_id", map.get("id"));  // 更新用户ID
        applicationService.update(wrapper);  // 执行更新操作

        return Result.success(applicationService.getById(ID));  // 返回更新后的报名详情
    }
}
